package shop; import java.util.ArrayList; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; import scheduler.Client; public class Counter implements Runnable { private int ID; private BlockingQueue<Client> clients; private boolean closed = false; private boolean running = true; private AtomicInteger waitingTime = new AtomicInteger(0); private AtomicInteger totalWaitingTime = new AtomicInteger(0); private AtomicInteger totalNrOfClients = new AtomicInteger(); private AtomicInteger totalServingTime = new AtomicInteger(); public Counter(int ID) { this.ID = ID; clients = new LinkedBlockingQueue<Client>(); } @Override public void run() { while (running) { try { while (clients.size() > 0) { for (Client client : clients) { Thread.sleep(client.getProcessingTime() * 500); clients.remove(client); } } } catch (InterruptedException e) { e.printStackTrace(); } } } public void setRunning(boolean b) { running = b; } public void addClient(Client c) { c.setWaitingTime(waitingTime.getAndAdd(c.getProcessingTime())); System.out.println( c.getArrivalTime() + " " + c.getWaitingTime() + " " + c.getProcessingTime() + " Counter " + ID); totalWaitingTime.addAndGet(c.getWaitingTime()); totalServingTime.addAndGet(c.getProcessingTime()); totalNrOfClients.getAndIncrement(); clients.add(c); } public Client[] getClientsArray() { Client[] clientsArray = new Client[clients.size()]; clients.toArray(clientsArray); return clientsArray; } public BlockingQueue<Client> getClientsList() { return clients; } public int getQueueSize() { return clients.size(); } public boolean isEmpty() { return clients.isEmpty(); } public void setClosed(boolean b) { closed = b; } public boolean isClosed() { return closed; } public float getAverageWaitingTime() { return (float) totalWaitingTime.get() / totalNrOfClients.get(); } public float getAverageServingTime() { return (float) totalServingTime.get() / totalNrOfClients.get(); } }